﻿using PersistenceLayer.DAL;
using PersistenceLayer.Model;
using SupportLayer.Constantes.PRODUTO;
using SupportLayer.Constantes.Tabelas;
using SupportLayer.Objetos.Produto;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ByBikeShop.Administracao.Pages
{
	public partial class Excel : BaseAdmin
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			base.PageLoad();
		}

		protected void btnEnviar_Click(object sender, EventArgs e)
		{
			try
			{
				int ProdutosAlterados = 0;

				if (fupExcel.HasFile)
				{
					if ((fupExcel.PostedFiles[0].ContentType != "application/vnd.ms-excel")
						&& (fupExcel.PostedFiles[0].ContentType != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
						throw new ApplicationException("Apenas arquivos do Excel!");

					string NomeArquivo = fupExcel.FileName;

					fupExcel.SaveAs(Server.MapPath("/Administracao/Excel/" + NomeArquivo));

					DataTable dt = Util.Excel.ReadExcel(Server.MapPath("/Administracao/Excel/" + NomeArquivo), NomeArquivo);

					//List<EspecificacaoClass> lstEspecificacoesModificadas = new List<EspecificacaoClass>();
					List<Produto_Especificacao> lpe = new List<Produto_Especificacao>();
					//List<ProdutoClass> lstProdutosModificados = new List<ProdutoClass>();
					List<Produto> lp = new List<Produto>();
					Produto_EspecificacaoDAL ped = new Produto_EspecificacaoDAL();
					ProdutoDAL pd = new ProdutoDAL();

					foreach (DataRow dr in dt.Rows)
					{
						string CodigoProduto = (Convert.ToInt32(dr["Codigo"].ToString()).ToString());

						Produto_Especificacao pe = ped.ObterPorCodigo(CodigoProduto);

						if (pe != null)
						{
							int Quantidade = 0;
							try
							{
								Quantidade = Convert.ToInt32(dr["Quantidade"].ToString());
							}
							catch (Exception)
							{
								throw new ApplicationException("A quantidade do produto de código " + CodigoProduto + " está em um formato incorreto!");
							}
							decimal Preco = 0;

							try
							{
								Preco = Math.Round(Convert.ToDecimal(dr["Preco"].ToString()));
							}
							catch (Exception)
							{
								throw new ApplicationException("O preço do produto de código " + CodigoProduto + " está em um formato incorreto!");
							}

							if (pe.Quantidade != Quantidade)
							{
								lblProdutosModificados.Text += "Produto código " + CodigoProduto + " alterou a quantidade de " + pe.Quantidade + " para " + Quantidade + "<br />";

								pe.Quantidade = Quantidade;
								//BProduto.UpdateEspecificacao(Especificacao);
								//lstEspecificacoesModificadas.Add(Especificacao);
								lpe.Add(pe);
								ProdutosAlterados++;
							}

							//ProdutoClass Produto = BProduto.SelectProduto(pe.Produto_ID, false, false);
							Produto p = pd.Obter(pe.Produto_ID);

							if (p == null)
								continue;

							if (p.Preco != Preco)
							{
								lblProdutosModificados.Text += "Produto código " + CodigoProduto + " alterou o preço de R$ " +
																								p.Preco.ToString("0.00").Replace('.', ',') + " para R$ " +
																								Preco.ToString("0.00").Replace('.', ',') + "<br />";

								p.Preco = Preco;
								//BProduto.UpdateProduto(Produto);
								lp.Add(p);
								ProdutosAlterados++;
							}
						}
					}

					Entities Entity = new Entities();

					foreach (Produto_Especificacao pe in lpe)
					{
						var oe = Entity.Produto_Especificacao.Where(a => a.ID == pe.ID).Single();
						Entity.Entry(oe).CurrentValues.SetValues(pe);
					}

					foreach (Produto p in lp)
					{
						var op = Entity.Produto.Where(a => a.ID == p.ID).Single();
						Entity.Entry(op).CurrentValues.SetValues(p);
					}

					Entity.SaveChanges();

					lblProdutos.Text = "Alterações: " + ProdutosAlterados;
					lblProdutosModificados.Text += "<br /><br />Processo finalizado! <br /><br /><br /><br />";
				}
			}
			catch (Exception ex)
			{
				string mensagem = "";

				if (ex.Message.Contains("inner exception"))
					if (ex.InnerException.Message.Contains("inner exception"))
						mensagem = ex.InnerException.InnerException.Message;
					else
						mensagem = ex.InnerException.Message;
				else
					mensagem = ex.Message;

				lblErro.Text = mensagem;
			}
		}

		public override void CarregaDados()
		{
		}

		public override void CarregaGrid()
		{
		}

		public override void PopulaGrid()
		{
		}
	}
}